var IPAddress = require('./IPAddress')
/**
 * 在网节点信息列表 []:IPAddress
 */
class OnlineNodeList {
  constructor(onlineListArr) {
    /** 在线节点列表     */
    this.nodeIpAddressArr = (onlineListArr && onlineListArr instanceof Array) ? onlineListArr : [];
  }
  
  /**
   * 1.0 获取 在网节点 个数
   */
  length() { 
    return this.nodeIpAddressArr.length;
  }

  /**
   * 2.0 根据 下标 获取节点信息
   * @param {*} index 
   */
  getByIndex(index) { 
    if (index >= this.nodeIpAddressArr.length)
      throw new Error('下标越界~~！');
    else
      return this.nodeIpAddressArr[index];
  }

  /**
   * 3.0 添加在网节点
   * @param nodeUri 为在网节点的 URI，服务端 ip + Http端口
   */
  add(nodeIPAddress) {
    if (!(nodeIPAddress instanceof IPAddress)) { 
      throw new Error('在线节点列表 只能添加 IPAddress 对象实例~！');
    }

    if (this.include(nodeIPAddress)) {
      console.log('在网节点列表中已存在【' + nodeIPAddress.getURI() + '】');
    } else {
      nodeIPAddress.protocol = nodeIPAddress.protocol.toLowerCase();
      this.nodeIpAddressArr.push(nodeIPAddress);
    }
  }

  /**
   * 4.0 更新整个 在线节点
   * @param newOnlineNodeArr 新的在线节点IPAddress数组
   */
  compareAdd(newOnlineNodeArr) {
    if (newOnlineNodeArr instanceof Array && newOnlineNodeArr.length != this.length()) {
      // 4.1 置空当前集合中的数组
      this.nodeIpAddressArr.length = 0;
      // 4.2 将新数组里的 地址 循环添加到 当前集合中的地址数组
      for (var i = 0; i < newOnlineNodeArr.length; i++) { 
        var nodeInfo = newOnlineNodeArr[i];
        // 4.3 为防止 新数组中的地址对象不是 IPAddress，重新创建每个对象
        this.nodeIpAddressArr.push(new IPAddress(nodeInfo.ip, nodeInfo.port));
      }
    }
  }

  /**
   * 0.1 判断列表中是否已存在某节点信息（根据 URI 判断）
   * @param  ipAddressObj 在网节点的 ipAddress
   */
  include(ipAddressObj) { 
    var isHere = false;
    for (var i = 0; i < this.nodeIpAddressArr.length; i++) {
      if (this.nodeIpAddressArr[i].getURI() == ipAddressObj.getURI()) { 
        isHere = true;
        break;
      }
    }
    return isHere;
  }

  /**
   * 0.2 将在线节点URI拼成一个URI字符串数组返回
   */
  toUriStrArray() { 
    var nodeArr = [];
    this.nodeIpAddressArr.forEach(function (node, i) { 
      nodeArr.push(node.getURI());
    })
    return JSON.stringify(nodeArr);
  }

  /**
   * 0.3 获取在网节点列表的 Json数组:IPAddress
   */
  toIpAddressJsonArray() { 
    return JSON.stringify(this.nodeIpAddressArr);
  }

  /**
   * 0.4 将节点URI数组json字符串转成数组对象
   * @param onlineNodeListJsonStr 节点URI数组json字符串
   * @returns OnlineNodeList 对象
   */
  static json2Obj(onlineNodeListJsonStr) {
    var jsonObj = JSON.parse(onlineNodeListJsonStr);
    return new OnlineNodeList(jsonObj.onlineNodeList);
  }
}


module.exports = OnlineNodeList;